#ifndef BOARD_H
#define BOARD_H

#include <http.h>
#include <mqtt.h>
#include <string>
#include <udp.h>
#include <web_socket.h>

#include "backlight.h"
#include "led/led.h"

void *create_board();
class AudioCodec;
class Display;
class Board {
private:
  Board(const Board &) = delete;            // 禁用拷贝构造函数
  Board &operator=(const Board &) = delete; // 禁用赋值操作
  virtual std::string GetBoardJson() = 0;

  std::string product_name_;

protected:
  Board();
  std::string GenerateUuid();

  // 软件生成的设备唯一标识
  std::string uuid_;

public:
  static Board &GetInstance() {
    static Board *instance = static_cast<Board *>(create_board());
    return *instance;
  }

  std::string GetProductName() { return product_name_; }

  virtual ~Board() = default;
  virtual std::string GetBoardType() = 0;
  virtual std::string GetUuid() { return uuid_; }
  virtual Backlight *GetBacklight() { return nullptr; }
  virtual Led *GetLed();
  virtual AudioCodec *GetAudioCodec() = 0;
  virtual Display *GetDisplay();
  virtual Http *CreateHttp() = 0;
  virtual WebSocket *CreateWebSocket() = 0;
  virtual Mqtt *CreateMqtt() = 0;
  virtual Udp *CreateUdp() = 0;
  virtual void StartNetwork() = 0;
  virtual const char *GetNetworkStateIcon() = 0;
  virtual bool GetBatteryLevel(int &level, bool &charging, bool &discharging);
  virtual std::string GetJson();
  virtual void SetPowerSaveMode(bool enabled) = 0;
};

#define DECLARE_BOARD(BOARD_CLASS_NAME)                                        \
  void *create_board() { return new BOARD_CLASS_NAME(); }

#endif // BOARD_H
